#ifndef FRAID_H_
#define FRAID_H_

typedef struct
{
	int32_t sock;
	int32_t cantSectores;
}packThread;

typedef struct  /// El NIPC en forma de struct
{
        char ID[16];   ///ID del mensaje
        char Tipo;   ///Tipo de mensaje (handshake, error, etc)
        int32_t Sector; //Sector involucrado en el pedido
        int16_t Length; ///Largo del payload (Datos)
        unsigned char* Datos;  ///Payload
} Paquete;

typedef struct nodoDisco
{
	char* nombre;
	int32_t sockDisco;
	int32_t sinc;
	int32_t flag;
	struct nodoDisco* sgte;
}tipoDisco;

typedef struct nodoPedido
{
		char ID[16];
		char tipo;
		int32_t length;
		int32_t atendido;
		int32_t	sector;
		int sock;
		unsigned char* msg;
		struct nodoPedido* sgte;
}tipoPedido;

typedef struct nodoSincro
{
		char ID[16];
		int32_t sectorListo;
		int sock;
		struct nodoSincro* sgte;
}tipoSincro;

void* nuevoThreadDisco(void*);
char* buscacfg (char* cad);
int32_t initSockGral(void);
void agregarDisco ( int sock, Paquete* paquete );
void itoa(int n, char s[]);
void reverse(char s[]);
int32_t responderHandshake ( int sock );
int32_t buscaDisco ( int sockDisco );
int32_t proximoDisco(void);
int32_t nuevoPedido(int sock, Paquete* paquete);
void RandomGG(char dst[16], int size);
Paquete* DesSerializar(char *unStream);
char* Serializar(Paquete* unPaquete);
void actualizarPedidosDe(int sockPD);
void eliminarPedido(char ID[16], int32_t sector);
void eliminarSincro( char unID[] );
char* nombreDisco(int sockPD);
int32_t esDisco(int buscaSocket);
void replicarPedido(Paquete* paquete);
int sincronizarCon( int32_t sockClon, int vecSectores[] , int32_t cantSectores , char ID[16], int32_t sectoresSincro );
void agregarSincro( char unID[16], int32_t sockClon);
int32_t proximoSectorAsinc( char unID[16] );
int32_t sonDistintos(char unID[16],char otroID[16]);
int32_t unDiscoSinc();
int32_t estaSincronizado(int32_t sock);
tipoDisco* proximoDiscoParaLeer(tipoDisco* ptr);
void replicarPedido(Paquete* unPaquete);
Paquete* revisarPUTwait( int32_t sock, int vecSincro[],Paquete* paquete);
void agregarPUTwait(int32_t sock, Paquete* paquete);
int otroDiscoConMismoNombre(unsigned char* nombre1);
int atenderPedido ( tipoPedido* ptrNuevoPedidos, int32_t sockPD, int vecSincro[] );
int sinDiscoSinc();
void eliminarPedidosDe( int32_t sockPD);
void eliminarPedidosSincroDe( int32_t sockPD);
void desincronizarDisco( int32_t sockPD );
#endif
